#pragma once

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

class InetAddr
{
private:
    void ToHost(const struct sockaddr_in &addr)
    {
        _port = ntohs(addr.sin_port);
        // _ip = inet_ntoa(addr.sin_addr);
        char ip_buffer[32];
        ::inet_ntop(AF_INET, &addr.sin_addr, ip_buffer, sizeof ip_buffer);
        _ip = ip_buffer;
    }

public:
    InetAddr(const struct sockaddr_in &addr) : _addr(addr)
    {
        ToHost(addr);
    }
    InetAddr()
    {
    }
    // 正确的拷贝构造函数
    InetAddr(const InetAddr &addr)
        : _port(addr._port),
          _ip(addr._ip),
          _addr(addr._addr) // 直接拷贝sockaddr_in结构体
    {
    }
    InetAddr(InetAddr &&addr)
        : _port(_port),
          _ip(std::move(addr._ip)),
          _addr(addr._addr)
    {
        memset(&addr._addr, 0, sizeof(addr._addr)); // 清空源结构体
    }
    InetAddr &operator=(InetAddr &&addr)
    {
        std::swap(addr._ip, _ip);
        _port = addr._port;
        _addr = addr._addr;
        return *this;
    }
    bool operator==(const InetAddr &addr) const
    {
        if (this == &addr)
            return true;
        return _port == addr._port && _ip == addr._ip;
    }
    std::string Ip()
    {
        return _ip;
    }
    uint16_t Port()
    {
        return _port;
    }
    struct sockaddr_in &Addr()
    {
        return _addr;
    }
    std::string AddrStr() const
    {
        return _ip + ":" + std::to_string(_port);
    }
    ~InetAddr()
    {
    }

private:
    uint16_t _port;
    std::string _ip;
    struct sockaddr_in _addr;
};